Skip to main content

关闭超时订单 方法


Kafka的时间轮

RocketMQ延迟消息


RabbitMQ死信队列
当RabbitMQ中的一条正常的消息,因为过了存活时间(TTL过期)、队列长度超限、被消费者拒绝等原因无法被消费时,就会变成Dead Message,即死信
缺点 可能造成队头阻塞

RabbitMQ插件
rabbitmq_delayed_message_exchange

Redis过期监听
缺点 有延时 没有持久化

Redis 的 zset
zset是一个有序集合,每一个元素(member)都关联了一个 score,可以通过 score 排序来取集合中的值。

我们将订单超时时间的时间戳(下单时间+超时时长)与订单号分别设置为 score 和 member。这样redis会对zset按照score延时时间进行排序。然后我们再开启redis扫描任务,获取”当前时间 > score”的延时任务,扫描到之后取出订单号,然后查询到订单进行关单操作即可。

使用redis zset来实现订单关闭的功能的优点是可以借助redis的持久化、高可用机制。避免数据丢失。但是这个方案也有缺点,那就是在高并发场景中,有可能有多个消费者同时获取到同一个订单号,一般采用加分布式锁解决,但是这样做也会降低吞吐型。


Redission(仅java)
优点解决了基于zset方案中的并发重复问题的,而且还能实现方式也比较简单,稳定性、性能都比较高